使用 SMTP 发送邮件

开启 SMTP 发信功能

您需要先开启 SMTP 发信功能才能通过 SMTP 接口发送邮件。

  1. 登录 邮件推送控制台

  2. 单击左侧导航栏中 发信地址,进入发信地址页面。

  3. 在发信地址列表中,找到您要开启 SMTP 发信功能的发信地址,在对应的操作栏中单击 设置 SMTP 密码

  4. 在弹出对话框中填写 SMTP 密码,然后单击 确定

SMTP 发信方法

SMTP 协议是一个简单的邮件传输协议,利用它您可以将邮件发送给别人。此协议使用命令和应答在客户端与服务器之间传输报文。即客户端发出一个命令,服务器返回一个应答。发送方与接收方进行一问一答的交互,由发送方控制这个对话。

SMTP RFC 协议参考 RFC5321

使用 SMTP 协议的邮件服务器分为两种:

  • 一种为邮件发送服务器,通常叫做 smtpd,需要发件人进行认证。

  • 一种为邮件接收服务器,通常叫做 mx,接收外部运营商用户投递给本地用户的邮件。

阿里云邮件推送的邮件服务器为 smtpd,所以需要进行用户认证(要求认证用户名和发件人必须一致),认证用户名(就是发件人)和密码可以通过控制台进行设置。

程序中调用 SMTP 发送邮件可以使用各种语言的 SMTP Library。详细参考,请见 SMTP 调用示例

通过 SMTP 协议发送邮件的整体过程如下:

  1. 客户端使用 telnet 命令连接到SMTP服务器,建立会话。

  2. 客户端发送一个 HELO 或 EHLO 命令。

  3. 客户端发送一个 AUTH 认证命令进行用户登录(使用 smtpd 方式)。

  4. 客户端发送一个 MAIL 命令指定发件人。

  5. 客户端发送一个 RCPT 命令指定收件人。

  6. 客户端发送一个 DATA 命令准备输入邮件正文。

  7. 客户端发送一个 . 命令(点命令)表示 DATA 命令结束。

  8. 客户端发送一个 QUIT 命令结束会话。

示例

为帮助您熟悉使用 SMTP 协议发送邮件的流程,提供以下 telnet 命令会话过程示例,来描述 SMTP 命令会话过程。

备注:其中 S 代表服务器,C 代表客户端。可以使用 Linux 命令 echo -n Content|base64 进行 base64 编码。

非加密方式:

$telnet smtpdm.aliyun.com 80
S:220 smtp.aliyun-inc.com MX AliMail Server(127.0.0.1)
C:EHLO test.com
S:250-smtp.aliyun-inc.com
S:250-8BITMIME
S:250-AUTH=PLAIN LOGIN XALIOAUTH
S:250-AUTH PLAIN LOGIN XALIOAUTH
S:250-PIPELINING
S:250 DSN
C:AUTH LOGIN
S:334 dXNlcm5hbWU6
C:YSoqKkBleGFtcGxlLm5ldA==         备注:用户名a***@example.net的base64编码
S:334 UGFzc3dvcmQ6
C:dGVzdA==                     备注:用户密码test的base64编码
S:235 Authentication successful
C:MAIL FROM: <a***@example.net>   备注:注意用 <> 将发件人扩起来
S:250 Mail Ok
C:RCPT TO: <a***@example.net>
S:250 Rcpt Ok
C:DATA
S:354 End data with <CR><LF>.<CR><LF>
C:subject: test
C:from: <a***@example.net>
C:to: <a***@example.net>
C:
C:test
C:.
S:Data Ok: queued as freedom ###envid=148316944
C:QUIT
S:221 Bye

加密方式(需要openssl工具配合):

openssl s_client -connect smtpdm.aliyun.com:465 -crlf
或
openssl s_client -cipher AES128-GCM-SHA256 -connect  smtpdm.aliyun.com:465 -tls1_3 -crlf

openssl连接成功后直接在同一窗口继续逐行输入下面客户端命令:

$openssl s_client -connect smtpdm.aliyun.com:465 -crlf
***
***
***
S:220 DirectMail Smtpd Server(127.0.0.1)
C:EHLO test.com
S:250-smtp.aliyun-inc.com
S:250-8BITMIME
S:250-AUTH=PLAIN LOGIN XALIOAUTH
S:250-AUTH PLAIN LOGIN XALIOAUTH
S:250-PIPELINING
S:250 DSN
C:AUTH LOGIN
S:334 dXNlcm5hbWU6
C:YSoqKkBleGFtcGxlLm5ldA==          备注:用户名a***@example.net的base64编码
S:334 UGFzc3dvcmQ6
C:dGVzdA==                        备注:用户密码test的base64编码
S:235 Authentication successful
C:MAIL FROM: <a***@example.net>  备注:注意用 <> 将发件人扩起来
S:250 Mail Ok
C:rcpt to: <a***1@example.net>  备注:rcpt to使用小写,大写可能识别错误
S:250 Rcpt Ok
C:DATA
S:354 End data with <CR><LF>.<CR><LF>
C:subject: test
C:from: <a***@example.net>
C:to: <a***1@example.net>
C:
C:test
C:.
S:250 Data Ok: queued as freedom ###envid=600000105713504612
C:QUIT
S:DONE

其中,DATA 命令后输入的邮件正文示例中,采用了最简单的文本字符串数据。对于标准的富文本邮件,应该进行规范的 MIME 格式化,包括主题、正文的编码等,这样可以降低被接收方服务器判为垃圾邮件的风险。

MIME 协议可参考 RFC2045。可以使用阿里云官网提供的 SMTP 发送示例中的各种语言 Library 进行 MIME 邮件编码。

如何构建 MIME 邮件,请参见 如何通过 SMTP 方式发送带附件的邮件?